/* ------------------------------------------------------------------------*
 *
 * ------------------------------------------------------------------------*/

#include "bsp.h"
#include "pincfg.h"
#include "mbapp.h"
#include "com_def.h"
#include "bsp_cpu_it.h"
#include "bsp_uart_timer.h"
#include "bsp_io.h"

/*******************************************************************************
 * @brief   端口信息描述
 *******************************************************************************/
#define qc_port USART3
#define qc_uart_irqn USART3_IRQn
#define qc_isr QC_USART3_IRQHandler
#define qc_obj mb.qc03
#define qc_cmd_list mb.qc_cmd03
#define qc_timer_run qc03_timer_run

//#define DMA_COM_RX DMA_U03_RX
//#define DMA_COM_TX DMA_U03_TX
//#define com_tx_dma_irq qc03_tx_dma_irq

/*******************************************************************************
 * @brief   RS485 - DIR
 *******************************************************************************/
#define qc_rx_enable()
#define qc_tx_enable()
#define RS485DE_CTR_IN_TIMER 0

/*******************************************************************************
 * @brief   common function create
 *******************************************************************************/
#include "bsp_qcom_gen.c"
qcom_api_make(USART3, qc_obj);

/*****************************************************************************
 * @brief   mb port.
 * @param   none
 * @return  none
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
static void qc_port_hal_cfg(void)
{
	intx_alloc();

	nvic_irq_set(qc_uart_irqn, 0x0F, 0);

	intx_disable();

	RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART3);
	RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_USART3);
	RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_USART3);

	intx_enable();
}

/*****************************************************************************
 * @brief   mb_cb_set
 * @param   none
 * @return  none
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
static void qc_cb_set(void)
{
	intx_alloc();

	qc_obj_init(&qc_obj, qc_cmd_list, sizeof(qc_cmd_list) / sizeof(qc_cmd_list[0]), 4);

	qc_obj.slave = &qc_mb_slave_box;
	qcom_api_link(USART3, qc_obj);
}

/*****************************************************************************
 * @brief   mb init .
 * @param   mbMode
 * @param   ulBaudRate
 * @param   eParity
 * @return  none
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void qc03_Init(uu08 qcMode, uint32_t ulBaudRate, mb_parity_type eParity)
{
	// 禁用中断
	nvic_irq_set(qc_uart_irqn, 0x0F, 0);
	uart_timer.uart03 = 0;

	// 中断映射
	cpu_it.uart03 = qc_isr;

	// 初始化
	qc_port_Init(qcMode, ulBaudRate, eParity);

	// 链接定时器任务
	uart_timer.uart03 = qc_timer_run;
	app_timer_task_add(uart03_timer_handle);
}
